#!/bin/bash

# Nombre: ceutdeploy.inc.sh
# Autor: Luis Guillen
# Fecha: 2008-11-21
# Descipcion:
#   Esta libreria proporciona las funciones de alto nivel de clonacion
#   Requiere de: base.inc.sh cifs.inc.sh ntfs.inc.sh
#   También es IMPRESCINDIBLE haber incluído ceutdeploy.cfg

existeImagen()
{
	cifsEstaMontado $DEPLOY_SERVER $CIFS_SHARE
	if [ $? -ne 0 ]; then
                escribeLog "ERROR: No está montado el recurso de imágenes"
                return 1
	fi
	if [ -d ${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${IMAGENES_PATH}/${1} ]; then
		return 0
	else
		return 1
	fi
}

obtenListadoImagenes()
{
	cifsEstaMontado $DEPLOY_SERVER $CIFS_SHARE
	if [ $? -ne 0 ]; then
                escribeLog "ERROR: No está montado el recurso de imágenes"
                return 1
	fi

	for path_imagen in ${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${IMAGENES_PATH}/*
	do
		nombre_imagen=`basename $path_imagen`
		if [ "${nombre_imagen}" = "*" ]; then
			escribeLog "ERROR: no existen imágenes disponibles en el repositorio"
			exit 1
		fi
		if [ -f $path_imagen/info.txt ]; then
			desc_imagen=`cat $path_imagen/info.txt`
		else
			desc_imagen=${nombre_imagen}
		fi

		echo "${nombre_imagen} \"${desc_imagen}\""
	done

	return 0
}

# Puede recibir por parametro el formato:
# 1 FORMAT_CHECKLIST
FORMAT_CHECKLIST=1
obtenListadoPaquetes()
{
	formato_salida=0

	if [ $# -eq 1 ]; then
		if [ $1 -eq 1 ]; then
			formato_salida=$FORMAT_CHECKLIST
		fi
		
	fi

	nombre_equipo=$1

	cifsEstaMontado $DEPLOY_SERVER $CIFS_SHARE
	if [ $? -ne 0 ]; then
                escribeLog "ERROR: No está montado el recurso de paquetes"
                return 1
	fi

	for path_paquete in ${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${PAQUETES_PATH}/*
	do
		nombre_paquete=`basename $path_paquete`
		if [ "${path_paquete}" = "*" ]; then
			escribeLog "ERROR: no existen paquetes disponibles en el repositorio"
			exit 1
		fi
		if [ -f $path_paquete/info.txt ]; then
			desc_paquete=`cat $path_paquete/info.txt`
		else
			desc_paquete=${nombre_paquete}
		fi

		if [ $formato_salida -eq $FORMAT_CHECKLIST ]; then
			echo "${nombre_paquete} \"${desc_paquete}\" off"
		else
			echo "${nombre_paquete} \"${desc_paquete}\""
		fi
	done

	return 0
}


# Obtiene un listado de los perfiles hardware
obtenListadoPerfilesHwd()
{
	cifsEstaMontado $DEPLOY_SERVER $CIFS_SHARE
	if [ $? -ne 0 ]; then
                escribeLog "ERROR: No está montado el recurso de drivers"
                return 1
	fi

	for path_perfil in ${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${DRIVERS_PATH}/perfiles/*
	do
		nombre_perfil=`basename $path_perfil`
		if [ "${nombre_perfil}" = "*" ]; then
			escribeLog "ERROR: no existen perfiles hardware disponibles en el repositorio"
			return 1
		fi
		if [ -f $path_perfil/info.txt ]; then
			desc_perfil=`cat $path_perfil/info.txt`
		else
			desc_perfil=${nombre_perfil}
		fi

		echo "${nombre_perfil} \"${desc_perfil}\""
	done

	return 0
}



existenDriversMaquina()
{
	if [ $# -ne 1 ]; then
		echo "existenDriversMaquina() ERROR: Debe de pasar el nombre de equipo!!"
		exit 1
	fi

	nombre_equipo=$1
	cifsEstaMontado $DEPLOY_SERVER $CIFS_SHARE
	if [ $? -ne 0 ]; then
                escribeLog "ERROR: No está montado el recurso de imágenes"
                return 1
	fi

	path_drivers=${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${DRIVERS_PATH}/maquinas

	if [ -d ${path_drivers}/${nombre_equipo} ]; then
		return 0
	else
		return 1
	fi

}

# Recibe el nombre de la imagen y el dispositivo
despliegaImagenParticion()
{
	if [ $# -ne 2 ]; then
		echo "despliegaImagen() ERROR: Debe de pasar la imagen y el dispositivo!!"
		exit 1
	fi

	imagen=$1
	dispositivo=$2

        ntfsExisteParticion $dispositivo
        if [ $? -ne 0 ]; then
                escribeLog "ERROR: la partición destino no es válida"
                return 1
        fi

	cifsEstaMontado $DEPLOY_SERVER $CIFS_SHARE
	if [ $? -ne 0 ]; then
                escribeLog "ERROR: No está montado el recurso de imágenes"
                return 1
	fi

	path_imagen=${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${IMAGENES_PATH}/${imagen}/imagen.img.gz
	if [ ! -f $path_imagen ];then
                escribeLog "ERROR: No se encuentra la imagen especificada en el repositorio!"
                return 1
	fi

# Obsoleto: Metodo www
#	wget -qO - http://${DEPLOY_SERVER}/${IMAGENES_PATH}/${imagen}.img.gz | gunzip -c | ntfsclone -r -O $dispositivo -

	cat ${path_imagen} | gunzip -c | ntfsclone -r -O $dispositivo -
	if [ $? -ne 0 ]; then
		escribeLog "ERROR durante el despliegue!"
		return 1
	fi

	escribeLog "La imagen se desplegó correctamente"

	return 0
}


copiaDriversMaquina()
{
	if [ $# -ne 2 ]; then
		echo "copiaDriversMaquina() ERROR: Debe de pasar el nombre de máquina y la partición!!"
		exit 1
	fi

	nombre_equipo=$1
	dispositivo=$2

	path_drivers=${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${DRIVERS_PATH}

	if [ -d ${path_drivers}/maquinas/${nombre_equipo} ]; then
		copiaDrivers /maquinas/${nombre_equipo} $dispositivo
		if [ $? -eq 0 ]; then
			escribeLog "Drivers de la máquina copiados"
			return 0
		else
			escribeLog "ERROR: durante la copia de los drivers de la máquina"
			return 1
		fi
	else
		escribeLog "ERROR: no existen los drivers de la máquina"
		return 1
	fi
}

copiaDriversPerfil()
{
	if [ $# -ne 2 ]; then
		echo "copiaDriversPerfil() ERROR: Debe de pasar el nombre del perfil hardware y la partición!!"
		exit 1
	fi

	nombre_perfil=$1
	dispositivo=$2

	path_drivers=${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${DRIVERS_PATH}

	if [ -d ${path_drivers}/perfiles/${nombre_perfil} ]; then
		copiaDrivers /perfiles/${nombre_perfil} $dispositivo
		if [ $? -eq 0 ]; then
			escribeLog "Drivers del perfil hardware copiados"
			return 0
		else
			escribeLog "ERROR: durante la copia de los drivers del perfil hardware"
			return 1
		fi
	else
		escribeLog "ERROR: no existen los drivers del perfil hardware"
		return 1
	fi
}

# Recibe el Path Relativo al origen de los drivers y la partición destino
# ej: copiaDrivers maquinas/NOMBRE /dev/sda1
copiaDrivers()
{
	if [ $# -ne 2 ]; then
		echo "copiaDrivers() ERROR: Debe de pasar el path relativo al origen de los drivers y la partición!!"
		exit 1
	fi

	path_relativo=$1
	dispositivo=$2
	nomdis=`echo $dispositivo | cut -f3 -d/`

	ntfsEstaMontado $dispositivo
	if [ $? -ne 0 ]; then
		escribeLog "ERROR: no se encuentra montada la partición a la que se deben copiar los drivers"
		return 1
	fi

	cifsEstaMontado $DEPLOY_SERVER $CIFS_SHARE
	if [ $? -ne 0 ]; then
                escribeLog "ERROR: No está montado el recurso de imágenes"
                return 1
	fi

	path_windows=${ROOTNTFS}/${nomdis}
	path_drivers=${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${DRIVERS_PATH}

	if [ -d ${path_drivers}/${path_relativo} ]; then
		mkdir ${path_windows}/D
		cp -r ${path_drivers}/${path_relativo}/* $path_windows/D

		for tipo_driver in ${path_windows}/D/*
		do
			# si es directorio
			if [ -d ${tipo_driver} ]; then 
				contador=1
				for driver in ${tipo_driver}/*
				do
					# si no está vacío
					if [ ! "${driver}" = "*" ]; then
						mv "${driver}" "${tipo_driver}"/${contador}
						let contador=contador+1
					fi
				done
			fi
		done

		escribeLog "Los drivers se copiaron correctamente"
	else
		escribeLog "No se pudieron copiar, no existe el directorio"
	fi

	return 0
}

# Registra los drivers en el registro
registraDrivers()
{
	if [ $# -ne 1 ]; then
		echo "registraDrivers() ERROR: Debe de pasar la particion!!"
		exit 1
	fi

	dispositivo=$1
	nomdis=`echo $dispositivo | cut -f3 -d/`

	ntfsEstaMontado $dispositivo
	if [ $? -ne 0 ]; then
		escribeLog "ERROR: no se encuentra montada la partición a la que se deben copiar los drivers"
		return 1
	fi

	path_particion=${ROOTNTFS}/${nomdis}

	
	cadena_drivers="%SystemRoot%\inf"
	if [ -d $path_particion/D ]; then
		pushd $path_particion
		for driver in D/*/*
		do
			echo $driver | tr "/" "\\" 2>/dev/null > /tmp/drv.txt
			driver_backslash=`cat /tmp/drv.txt`
			cadena_drivers="${cadena_drivers};%SystemDrive%\\${driver_backslash}"
		done
		popd
	fi

	escribeLog "La cadena de drivers es: $cadena_drivers"


	path_reg_software=${ROOTNTFS}/${nomdis}/WINDOWS/system32/config/software
	if [ ! -f $path_reg_software ]; then
		escribeLog "ERROR: no se encuentra el fichero de registro!"
	fi

	$LOCALDIR/../includes/set_reg_devicepath.exp $path_reg_software $cadena_drivers

	escribeLog "Se ha fijado la cadena de drivers"
}

# Copia los ficheros del directorio i386 del cd de instalacion de windows
copiaInstaladorWindows()
{
	if [ $# -ne 2 ]; then
		echo "copiaInstaladorWindows() ERROR: Debe de pasar el nombre de la imágen y la partición!!"
		exit 1
	fi

	imagen=$1
	dispositivo=$2
	nomdis=`echo $dispositivo | cut -f3 -d/`

	ntfsEstaMontado $dispositivo
	if [ $? -ne 0 ]; then
		escribeLog "ERROR: no se encuentra montada la partición a la que se deben copiar los drivers"
		return 1
	fi

	cifsEstaMontado $DEPLOY_SERVER $CIFS_SHARE
	if [ $? -ne 0 ]; then
                escribeLog "ERROR: No está montado el recurso de imágenes"
                return 1
	fi

	#fix: usar la nueva funcion getPathi386
	path_i386=${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${IMAGENES_PATH}/${imagen}/i386

	if [ ! -d $path_i386 ]; then
		escribeLog "No existe el recurso i386 específico para la imagen dada, se copiará el genérico"
		path_i386=${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/i386
		if [ ! -d $path_i386 ]; then
			escribeLog "ERROR: no existe el recurso i386 en el share, no se copiarán los archivos!"
			return 1
		fi
	fi

	path_particion=${ROOTNTFS}/${nomdis}
	if [ ! -d $path_particion/sysprep/i386 ]; then
		escribeLog "ERROR: no existe el directorio sysprep/i386 en la imagen, no se copiarán los archivos!"
		return 1
	fi

	escribeLog "Copiando ficheros del cd de instalación de windows... "
	mkdir -p $path_particion/sysprep/i386
	cp -rf $path_i386/* $path_particion/sysprep/i386
	escribeLog "Ficheros copiados"

	return 0
}

# Recibe la partición en la que se encuentra el sysprep inf y llama a Configura sysprep.inf
# de la librería sysprep
configuraSysprep()
{
	if [ $# -ne 1 ]; then
		echo "configuraSysprep() ERROR: Debe de pasar el fichero sysprep!!"
		exit 1
	fi

	dispositivo=$1
	nomdis=`echo $dispositivo | cut -f3 -d/`

	ntfsEstaMontado $dispositivo
	if [ $? -ne 0 ]; then
		escribeLog "ERROR: no se encuentra montada la partición para modificar sysprep!"
		return 1
	fi

	path_sysprep=${ROOTNTFS}/${nomdis}/sysprep

	if [ ! -f $path_sysprep/sysprep.inf ]; then
		escribeLog "ERROR: no se encuentra el fichero sysprep.inf!"
		return 1
	fi

	configuraSysprepInf $path_sysprep/sysprep.inf
	if [ $? -ne 0 ]; then
		escribeLog "ERROR: al modificar sysprep.inf!"
		return 1
	fi
}

# Desactiva el servicio intelppm
deshabilitaIntelPpm()
{
	if [ $# -ne 1 ]; then
		echo "deshabilitaIntelPpm() ERROR: Debe de pasar la particion!!"
		exit 1
	fi

	dispositivo=$1
	nomdis=`echo $dispositivo | cut -f3 -d/`

	ntfsEstaMontado $dispositivo
	if [ $? -ne 0 ]; then
		escribeLog "ERROR: no se encuentra montada la partición"
		return 1
	fi

	path_particion=${ROOTNTFS}/${nomdis}

	path_reg_system=${ROOTNTFS}/${nomdis}/WINDOWS/system32/config/system
	if [ ! -f $path_reg_system ]; then
		escribeLog "ERROR: no se encuentra el fichero de registro system!"
	fi

	$LOCALDIR/../includes/set_reg_disable_intelppm.exp $path_reg_system

	escribeLog "Se ha deshablitado el servicio intelppm de los controlset001 y controlset002"
}

getPathi386() {
	if [ $# -ne 1 ]; then
		echo "getPathi386() ERROR: Debe de pasar el nombre dimagen!!"
		exit 1
	fi
	local imagen=$1
	local path_i386

	path_i386=${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${IMAGENES_PATH}/${imagen}/i386

	if [ ! -d $path_i386 ]; then
		path_i386=${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/i386
		if [ ! -d $path_i386 ]; then
			return 1
		fi
	fi
	
	echo $path_i386
	return 0
}

cambiaHal() {
	if [ $# -ne 3 ]; then
		echo "cambiaHal() ERROR: Debe pasar el nombre de imagen, dispositivo y nhal!!"
		exit 1
	fi
	local imagen=$1
	local dispositivo=$2
	local hal=$3
	local path_i386=`getPathi386 $imagen`
	
	local nomdis=`echo $dispositivo | cut -f3 -d/`

	ntfsEstaMontado $dispositivo
	if [ $? -ne 0 ]; then
		escribeLog "ERROR: no se encuentra montada la partición para modificar sysprep!"
		return 1
	fi

	halUpper=`echo $hal | tr [a-z] [A-Z]`
	cp ${path_i386}/${halUpper}.DL_ /tmp
	cabextract /tmp/${halUpper}.DL_ -d /tmp/
	cp /tmp/${hal}.dll ${ROOTNTFS}/${nomdis}/WINDOWS/system32/hal.dll

	escribeLog "Se ha cambiado la hal por ${hal}"
}

obtenListadoHals() {
	echo "halacpi \"Equipo compatible con Advanced Configuration and Power Interface (ACPI)\""
}



creaImagenParticion()
{
	if [ $# -lt 2 ]; then
		echo "creaImagenParticion() ERROR: Debe de pasar el dispositivo y el nombre de imagen!!"
		exit 1
	fi

	local dispositivo=$1
	local imagen=$2
	local desc=$3

        ntfsExisteParticion $dispositivo
        if [ $? -ne 0 ]; then
                escribeLog "ERROR: la partición de origen no es válida"
                return 1
        fi

	cifsEstaMontado $DEPLOY_SERVER $CIFS_SHARE
	if [ $? -ne 0 ]; then
                escribeLog "ERROR: No está montado el recurso de imágenes"
                return 1
	fi

	path_imagen=${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${IMAGENES_PATH}/${imagen}

	if [ -d $path_imagen ]; then
                escribeLog "ERROR: Ya exite una imagen con ese nombre en el repositorio!"
	fi

	mkdir -p ${ROOTCIFS}/${DEPLOY_SERVER}/${CIFS_SHARE}/${IMAGENES_PATH}/${imagen}

	ntfsclone -s -o - /dev/sda1 | gzip - > $path_imagen/imagen.img.gz
	if [ $? -ne 0 ]; then
		escribeLog "ERROR durante la toma de la imagen!"
		return 1
	fi

	ntfsinfo -mft $dispositivo > $path_imagen/ntfsinfo.txt
	echo $desc > $path_imagen/info.txt

	escribeLog "La imagen se generó correctamente"

	return 0
}


